 /*******************************************************************************
  * Copyright (c) 2000, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  * Chris Gross chris.gross@us.ibm.com Bug 107443
  *******************************************************************************/
 package org.eclipse.ui.internal;

 import org.eclipse.ui.IFolderLayout;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.activities.WorkbenchActivityHelper;
 import org.eclipse.ui.views.IViewDescriptor;

 /**
  * This layout is used to define the initial set of views and placeholders
  * in a folder.
  * <p>
  * Views are added to the folder by ID. This id is used to identify
  * a view descriptor in the view registry, and this descriptor is used to
  * instantiate the <code>IViewPart</code>.
  * </p>
  */
 public class FolderLayout implements IFolderLayout {
     private ViewStack folder;

     private PageLayout pageLayout;

     private ViewFactory viewFactory;

     /**
      * Create an instance of a <code>FolderLayout</code> belonging to a
      * <code>PageLayout</code>.
      */
     public FolderLayout(PageLayout pageLayout, ViewStack folder,
             ViewFactory viewFactory) {
         super();
         this.folder = folder;
         this.viewFactory = viewFactory;
         this.pageLayout = pageLayout;
     }

     /* (non-Javadoc)
      * @see org.eclipse.ui.IPlaceholderFolderLayout#addPlaceholder(java.lang.String)
      */
     public void addPlaceholder(String viewId) {
         if (!pageLayout.checkValidPlaceholderId(viewId)) {
             return;
         }

         // Create the placeholder.
 PartPlaceholder newPart = new PartPlaceholder(viewId);
         linkPartToPageLayout(viewId, newPart);

         // Add it to the folder layout.
 folder.add(newPart);
     }

     /* (non-Javadoc)
      * @see org.eclipse.ui.IFolderLayout#addView(java.lang.String)
      */
     public void addView(String viewId) {
         if (pageLayout.checkPartInLayout(viewId)) {
             return;
         }

         try {
             IViewDescriptor descriptor = viewFactory.getViewRegistry().find(
                     ViewFactory.extractPrimaryId(viewId));
             if (descriptor == null) {
                 throw new PartInitException("View descriptor not found: " + viewId); //$NON-NLS-1$
 }
             if (WorkbenchActivityHelper.filterItem(descriptor)) {
                 //create a placeholder instead.
 addPlaceholder(viewId);
                 LayoutHelper.addViewActivator(pageLayout, viewId);
             } else {

                 ViewPane newPart = LayoutHelper.createView(pageLayout
                         .getViewFactory(), viewId);
                 linkPartToPageLayout(viewId, newPart);
                 folder.add(newPart);
             }
         } catch (PartInitException e) {
             // cannot safely open the dialog so log the problem
 WorkbenchPlugin.log(getClass(), "addView(String)", e); //$NON-NLS-1$
 }
     }

     /**
      * Inform the page layout of the new part created
      * and the folder the part belongs to.
      */
     private void linkPartToPageLayout(String viewId, LayoutPart newPart) {
         pageLayout.setRefPart(viewId, newPart);
         pageLayout.setFolderPart(viewId, folder);
         // force creation of the view layout rec
 pageLayout.getViewLayoutRec(viewId, true);
     }

     /* (non-Javadoc)
      * @see org.eclipse.ui.IPlaceholderFolderLayout#getProperty(java.lang.String)
      */
     public String getProperty(String id) {
         return folder.getProperty(id);
     }

     /* (non-Javadoc)
      * @see org.eclipse.ui.IPlaceholderFolderLayout#setProperty(java.lang.String, java.lang.String)
      */
     public void setProperty(String id, String value) {
         folder.setProperty(id,value);
     }
 }

